今天要來介紹如何在Gin中上傳檔案
BTW Gin的官方Docs怎麼都是只有範例,沒有說明各Method怎麼用的。
我真的不習慣看這種Docs,看來我比較習慣看類似fastapi的Docs
首先是單檔案處理,這邊我們透過c.FormFile
來取得檔案,這樣我們就得到一個*multipart.FileHeader
的物件,這個物件包含了檔案的資訊,例如檔案名稱、檔案大小等等,接著我們就可以透過c.SaveUploadedFile
來儲存檔案(記得設定Header中的Content-Type
為multipart/form-data
)
r.POST("/upload", func(c *gin.Context) {
file, err := c.FormFile("file")
if err != nil {
c.String(400, "Bad Request %s", err.Error())
return
}
fmt.Printf("File %s: size %d(byte)\n", file.Filename, file.Size)
c.JSON(
200,
gin.H{
"message": "upload success",
"name": file.Filename,
"size": file.Size,
},
)
})
再來是多檔案處理,首先我們需要先透過c.MultipartForm
來進行初始化,接著透過剛才初始化的物件的.File
來取得檔案,這樣我們就得到一個[]*multipart.FileHeader
的物件,這個物件包含了所有檔案的資訊
type FileInfo struct {
Name string `json:"name"`
Size int64 `json:"size"`
Dest string `json:"saved_to"`
}
r.POST("/uploads", func(c *gin.Context) {
form, _ := c.MultipartForm()
files := form.File["file"]
var fileInfos []FileInfo
for _, file := range files {
fmt.Printf("File %s: size %d(byte)\n", file.Filename, file.Size)
c.SaveUploadedFile(file, fmt.Sprintf("upload/%s", file.Filename))
fileInfos = append(fileInfos, FileInfo{
Name: file.Filename,
Size: file.Size,
Dest: fmt.Sprintf("upload/%s", file.Filename),
})
}
c.JSON(200, fileInfos)
})
那麼今天的文章就到這告一段落,如果我的文章有任何地方有錯誤請在留言區反應
明天將會講如何在Gin中架設RESTful API